home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / syscall < prev    next >
Encoding:
Text File  |  1992-08-15  |  2.5 KB  |  100 lines

  1. int
  2. do_syscall(arglast)
  3. int *arglast;
  4. {
  5.     register STR **st = stack->ary_array;
  6.     register int sp = arglast[1];
  7.     register int items = arglast[2] - sp;
  8. #ifdef atarist
  9.     unsigned long arg[14]; /* yes, we really need that many ! */
  10. #else
  11.     unsigned long arg[8];
  12. #endif
  13.     register int i = 0;
  14.     int retval = -1;
  15.  
  16. #ifdef HAS_SYSCALL
  17. #ifdef TAINT
  18.     for (st += ++sp; items--; st++)
  19.     tainted |= (*st)->str_tainted;
  20.     st = stack->ary_array;
  21.     sp = arglast[1];
  22.     items = arglast[2] - sp;
  23. #endif
  24.     TAINT_PROPER("syscall");
  25.     /* This probably won't work on machines where sizeof(long) != sizeof(int)
  26.      * or where sizeof(long) != sizeof(char*).  But such machines will
  27.      * not likely have syscall implemented either, so who cares?
  28.      */
  29.     while (items--) {
  30.     if (st[++sp]->str_nok || !i)
  31.         arg[i++] = (unsigned long)str_gnum(st[sp]);
  32. #ifndef lint
  33.     else
  34.         arg[i++] = (unsigned long)st[sp]->str_ptr;
  35. #endif /* lint */
  36.     }
  37.     sp = arglast[1];
  38.     items = arglast[2] - sp;
  39.     switch (items) {
  40.     case 0:
  41.     fatal("Too few args to syscall");
  42.     case 1:
  43.     retval = syscall(arg[0]);
  44.     break;
  45.     case 2:
  46.     retval = syscall(arg[0],arg[1]);
  47.     break;
  48.     case 3:
  49.     retval = syscall(arg[0],arg[1],arg[2]);
  50.     break;
  51.     case 4:
  52.     retval = syscall(arg[0],arg[1],arg[2],arg[3]);
  53.     break;
  54.     case 5:
  55.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4]);
  56.     break;
  57.     case 6:
  58.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5]);
  59.     break;
  60.     case 7:
  61.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6]);
  62.     break;
  63.     case 8:
  64.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
  65.       arg[7]);
  66.     break;
  67. #ifdef atarist
  68.     case 9:
  69.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
  70.       arg[7], arg[8]);
  71.     break;
  72.     case 10:
  73.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
  74.       arg[7], arg[8], arg[9]);
  75.     break;
  76.     case 11:
  77.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
  78.       arg[7], arg[8], arg[9], arg[10]);
  79.     break;
  80.     case 12:
  81.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
  82.       arg[7], arg[8], arg[9], arg[10], arg[11]);
  83.     break;
  84.     case 13:
  85.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
  86.       arg[7], arg[8], arg[9], arg[10], arg[11], arg[12]);
  87.     break;
  88.     case 14:
  89.     retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
  90.       arg[7], arg[8], arg[9], arg[10], arg[11], arg[12], arg[13]);
  91.     break;
  92. #endif /* atarist */
  93.     }
  94.     return retval;
  95. #else
  96.     fatal("syscall() unimplemented");
  97. #endif
  98. }
  99.  
  100.